<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // 需求  如果一个数组 里面有若干条对象,指定对象的某一个属性,如果这些都有这个属性并且对应的属性值还相同时,就累加这条对象的num值
    // 但凡没有这个属性或者有这个属性(但凡只要一个属性值不相等时)都返回0

    // 数组series里面对象有 stack属性 但是值各不相同
    const series = [{
      uname: 'jgg',
      stack: 'hehe',
      num: 90
    }, {
      uname: 'dgg',
      stack: 'haha',
      num: 80

    }, {
      uname: 'xgg',
      stack: 'xixi',
      num: 70

    }]
    //  数组series1里面对象 是有stack属性 并且值都是相同的
    const series1 = [{
      uname: 'jgg',
      stack: 'haha',
      num: 90
    }, {
      uname: 'dgg',
      stack: 'haha',
      num: 80

    }, {
      uname: 'xgg',
      stack: 'haha',
      num: 70

    }]
    // 数组series2 里面对象有stack属性 但是其中一个属性值与其他的不相同
    const series2 = [{
      uname: 'jgg',
      stack: 'heha',
      num: 90
    }, {
      uname: 'dgg',
      stack: 'haha',
      num: 80

    }, {
      uname: 'xgg',
      stack: 'haha',
      num: 70

    }]
    //  数组series3 里面对象压根就没有 stack属性
    const series3 = [{
      uname: 'jgg',
      // stack: 'heha',
      num: 90
    }, {
      uname: 'dgg',
      // stack: 'haha',
      num: 80

    }, {
      uname: 'xgg',
      // stack: 'haha',
      num: 70

    }]
    // 数组series4 里面对象有stack属性 但是属性值不相同 并且有一条对象还没有stack属性
    const series4 = [{
      uname: 'jgg',
      stack: 'haha',
      num: 90
    }, {
      uname: 'dgg',
      stack: 'hehe',
      num: 80

    }, {
      uname: 'xgg',
      // stack: 'haha',
      num: 70

    }]

    // 封装这样一个专门用来检测数组的对象的函数 返回最终num的值  如果数组对象里面有stack属性 并且属性值相等 就把对所有的num值累加  否则的话就num赋值为0
    function fn(arr) {
      // 声明total 最终要不return累加值 要不return 0
      let total = 0
      // 声明一个新的数组 用来接收对象属性的值
      // let newArr = []
      // 遍历arr数组 拿到每一条对象stack的值 
      // for (const item of arr) {
      //   // console.log(item)
      //   // 如果对象有stack属性 就追加到新数组里面
      //   if (item.stack) newArr.push(item.stack)

      // }
      // 当然也可以map数组 把满足条件的拿出来推送到newArr数组里面去 满足条件的话此时newArr里面就是存放着对应的stack的属性值
      const newArr = arr.map(function (ele, i) {
        // console.log(ele.stack)
        if (ele.stack) return ele.stack
        return []
      })

      // 如果说newArr的长度 === arr的长度  就表示arr数组里面的每一条对象都有stack属性 但是注意有可能newArr是[[],[],[]]存在
      const re = (newArr.length === arr.length) && newArr.every(function (ele, i) {
        // newArr  every一下就是看newArr数组的每一项的值是否相等 如果都相等的话 就进行下面的累加操作  
        // 只要有任意一项不相同的话就不累加  
        // 注意 []===[] 返回的是false 因为数组是复杂数据类型 所以比较的时候去比较的地址是否相同
        return ele === newArr[0]
      })

      // 如果上述操作返回的结果是true表示 newArr里面的每一项都相同
      if (re) {
        let init = 0
        // 这里就是进行累加操作
        //  直接遍历arr数组 把里面的每一条对象的num拿出来累加 这个reduce看不懂 可以用最基础的for循环也可以实现
        /*
         for (let i = 0; i < arr.length; i++) {
          total += arr[i].num
        }
        */

        total = arr.reduce(function (pre, cur) {
          return pre + cur.num
        }, init)
        return total
      }
      //  如果上述操作的结果是false 就直接把total丢出去
      return total
    }


    const re = fn(series) // // 数组series里面对象 stack属性 但是值各不相同  对应输出的结果应该是0
    const re1 = fn(series1) //  数组series1 里面对象是有stack属性 并且值都是相同的  对应输出的结果应该是累加值 240
    const re2 = fn(series2) // 数组series2 里面对象有stack属性 但是其中一个属性值与其他的不相同 对应输出结果是0
    const re3 = fn(series3) //  数组series3 里面对象压根就没有 stack属性 对应输出结果是0
    const re4 = fn(series4)  // 数组series4 里面对象有stack属性 但是属性值不相同 并且有一条对象还没有stack属性 对应输出结果为0

    console.log(re)   // 0
    console.log(re1)  //240 
    console.log(re2)  //0
    console.log(re3)  // 0
    console.log(re4)  // 0




    console.log([] === [], '数组是复杂数据类型,比较的是存放的地址')


  </script>
</body>

</html>